///<reference types="vitest" />
// 上面三斜杠指令用来支持测试配置项

import { ConfigEnv, loadEnv } from "vite";
import { resolve } from "path";
import { createVitePlugins } from "./build/utils/plugins";
import { wrapperEnv } from "./build/utils/env"; // 不支持别名导出
import { createProxy } from "./build/utils/proxy";

// 绝对路径
function pathResolve(dir: string) {
  return resolve(process.cwd(), ".", dir);
}

// vite 默认只会编译 ts 不会检测 ts, 而 vue-tsc 可以对 Vue3 进⾏ Typescript 类型较验
export default ({ command, mode }: ConfigEnv) => {
  // 执行命令路径
  const root = process.cwd();
  // 获取配置文件中的数据 (注意与 import.meta.env 获取所有环境变量两者还是有些不同的)
  const env = loadEnv(mode, root); // mode 为当前模式
  // 将环境变量中字符串键值转为合理数据类型
  const viteEnv = wrapperEnv(env);
  const { VITE_PORT, VITE_PROXY } = viteEnv;
  // 命令执行是否为打包
  const isBuild = command === "build";
  return {
    // 根目录
    root,
    // 插件
    plugins: createVitePlugins(viteEnv, isBuild),
    // 代理
    server: {
      port: VITE_PORT, // 项目监听端口
      proxy: createProxy(VITE_PROXY) // 代理服务器
    },
    // 别名
    resolve: {
      // 配置类似于 rollup 一样, 路径别名配置
      alias: [
        // /@/xxxx => src/xxxx
        {
          find: /\/@\//,
          replacement: pathResolve("src") + "/"
        },
        // /#/xxxx => types/xxxx
        {
          find: /\/#\//,
          replacement: pathResolve("types") + "/"
        }
      ]
    },
    // 测试
    test: {
      globals: true,
      environment: "happy-dom",
      transformMode: { web: [/.tsx$/] } // 支持 tsx 语法
    }
  };
};

// unocss 原子 Atomic css,  也可以 scss less 预处理
